package com.zjsru.oneDay;

import java.util.Arrays;

/**
 * 供暖器
 * <p>
 * 输入: houses = [1,2,3], heaters = [2]
 * 输出: 1
 * 解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1，那么所有房屋就都能得到供暖。
 */
public class findRadius {
    public int findRadius(int[] houses, int[] heaters) {
        Arrays.sort(houses);
        Arrays.sort(heaters);
        int l = 0, r = (int) 1e9;
        while (l < r) {
            int mid = l + r >> 1;
            if (check(houses, heaters, mid)) r = mid;
            else l = mid + 1;
        }
        return r;
    }
    boolean check(int[] houses, int[] heaters, int x) {
        int n = houses.length, m = heaters.length;
        for (int i = 0, j = 0; i < n; i++) {
            while (j < m && houses[i] > heaters[j] + x) j++;
            if (j < m && heaters[j] - x <= houses[i] && houses[i] <= heaters[j] + x) continue;
            return false;
        }
        return true;
    }

    public static void main(String[] args){
        int[] house = new int[]{1,2,3};
        int[] heaters = new int[]{2};
        findRadius findRadius = new findRadius();
        int result = findRadius.findRadius(house,heaters);
        System.out.println(result);
    }
}

/**
 * 因此可直接「二分答案」，考虑应该在什么范围内进行「二分」。
 *
 * 可以从数据范围入手，使用 1e91e9 为二分上界，该做法能确保答案在二分范围内。
 *
 * 考虑如何实现 check 函数。
 *
 * 先对 houseshouses 和 heatersheaters 进行排序，使用 ii 指向当前处理到的 houses[i]houses[i]；jj 指向 可能 覆盖到 houses[i]houses[i] 的最小下标 heaters[j]heaters[j]；xx 代表当前需要 check 的半径。
 *
 * 当且仅当 heaters[j] + x < houses[i]heaters[j]+x<houses[i] 时，houses[i]houses[i] 必然不能被 heaters[j]heaters[j] 所覆盖，此时让 jj 自增。
 *
 * 找到合适的 jj 之后，再检查 heaters[j] - x <= houses[i] <= heaters[j] + xheaters[j]−x<=houses[i]<=heaters[j]+x 是否满足，即可知道 houses[i]houses[i] 的覆盖情况。
 *
 * */
